package com.day17;

import org.junit.Test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
/**
 * 泛型的使用
 *
 * 1.jdk5.0新增的特性
 *
 * 2.在集合中使用泛型:
 *  总结:
 *  1.集合接口或集合类在jdk5.0时都修改为带泛型的类型
 *  2.在实例化集合时，可以指明具体的泛型类型
 *  3.指明完成以后,在集合类或接口中凡是定义类或接口时，内部结构(比如方法，构造器，属性等)使用了类的泛型，实例化后都指定为实例化的类型
 *  比如: add(E e) --->实例化: add(Integer e)
 *
 *  4.注意点:泛型的类型必须是类，不能是基本数据类型，需要用到基本数据类型的位置，拿包装类替换
 *
 *  5.如果实例化时，没有指明泛型的类型，默认类型为java.lang.Object
 *
 *
 * 3.如何自定义泛型结构:泛型类，泛型接口,泛型方法。
 */
public class  GenericTest {


    //在集合中使用泛型之前的情况:
    @Test
    public void test1() {

        ArrayList objects = new ArrayList();

        //需求:存放学生的成绩
        objects.add(78);
        objects.add(78);
        objects.add(78);
        objects.add(78);
        objects.add(78);

        //问题一:类型不安全
//        objects.add("Tom");


        for (Object object : objects) {
            System.out.println(object);
        }
    }

    //在集合中使用泛型的情况:
    @Test
    public void test2() {
        ArrayList<Integer> integers = new ArrayList<>();


        integers.add(78);
        integers.add(78);
        integers.add(78);
        integers.add(78);
        integers.add(78);
        integers.add(78);

        //再指定集合泛型后，在编译时就会进行类型检查，保证数据的安全
//        integers.add("Tom");

        for (Integer score : integers) {
            //避免了强制的转换的操作
            int a = score;
            System.out.println(a);
        }


        //方式二遍历:以hashMap为例
        Map<String, Integer> objectObjectHashMap = new HashMap<>();

//        Set objects = objectObjectHashMap.entrySet();
//        Iterator iterator = objects.iterator();
//
//        while (iterator.hasNext()){
//
//            Map.Entry next = (Map.Entry) iterator.next();
//            Object value = next.getValue();
//            Object key = next.getKey();
//
//
//        }

        objectObjectHashMap.put("Tom",89);

        //泛型的前提
        Set<Entry<String, Integer>> entries = objectObjectHashMap.entrySet();



    }

}
